/*
 * logger.h
 *
 *  Created on: 17.01.2012
 *      Author: knz
 */

#ifndef LOGGER_H_
#define LOGGER_H_

#include <syslog.h>

class Logger;
extern Logger *g_pLog;

#define LV_EMERG(msg, ...)   if (g_pLog) g_pLog->addEmerg(msg, __VA_ARGS__)
#define LV_ALERT(msg, ...)   if (g_pLog) g_pLog->addAlert(msg, __VA_ARGS__)
#define LV_CRIT(msg, ...)    if (g_pLog) g_pLog->addCritical(msg, __VA_ARGS__)
#define LV_ERR(msg, ...)     if (g_pLog) g_pLog->addError(msg, __VA_ARGS__)
#define LV_WARNING(msg, ...) if (g_pLog) g_pLog->addWarning(msg, __VA_ARGS__)
#define LV_NOTICE(msg, ...)  if (g_pLog) g_pLog->addNotice(msg, __VA_ARGS__)
#define LV_INFO(msg, ...)    if (g_pLog) g_pLog->addInfo(msg, __VA_ARGS__)
#define LV_DEBUG(msg, ...)   if (g_pLog) g_pLog->addDebug(msg, __VA_ARGS__)

#define LG_EMERG(msg)   if (g_pLog) g_pLog->addEmerg(msg)
#define LG_ALERT(msg)   if (g_pLog) g_pLog->addAlert(msg)
#define LG_CRIT(msg)    if (g_pLog) g_pLog->addCritical(msg)
#define LG_ERR(msg)     if (g_pLog) g_pLog->addError(msg)
#define LG_WARNING(msg) if (g_pLog) g_pLog->addWarning(msg)
#define LG_NOTICE(msg)  if (g_pLog) g_pLog->addNotice(msg)
#define LG_INFO(msg)    if (g_pLog) g_pLog->addInfo(msg)
#define LG_DEBUG(msg)   if (g_pLog) g_pLog->addDebug(msg)

class Logger {
private:
    Logger(const char *pchLogName, bool bSyslog=true);

public:
        static Logger* createLogger(const char *pchLogName, bool bSyslog=true);
        virtual ~Logger();

        //! \brief Установка уровня отсечения сообщений (см. LOG_XXX в syslog.h)
        void setTrimLevel(int iTrimLevel);
        /*! \brief Установка аргумента в значение true вызовет перенаправление
            всех логов в стандартные поток ошибок stderr */
        void setConsoleSwitch(bool bToConsole);

        void addEmerg(const char *msg, ...);
        void addAlert(const char *msg, ...);
        void addCritical(const char *msg, ...);
        void addError(const char *msg, ...);
        void addWarning(const char *msg, ...);
        void addNotice(const char *msg, ...);
        void addInfo(const char *msg, ...);
        void addDebug(const char *msg, ...);
private:
        char *m_pchLogName;
        bool m_bSyslog;
        int  m_iBufSize;
        char *m_pchBuf;
        int  m_iTrimLevel;
        bool m_bToConsole;

        void saveToFile(const char *pchSuffix);
        void saveToStdErr(const char *pchSuffix);
};

#endif /* LOGGER_H_ */
